package com.lgc.javathread.threadLocalTest.test4;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * DateFormat 和 SimpleDateFormat 类不都是线程安全的，在多线程环境下调用 format() 和 parse() 方法应该使用同步代码来避免问题
 * SimpleDateFormat中的日期格式不是同步的。推荐（建议）为每个线程创建独立的格式实例（即用ThreadLocal）。
 * 如果多个线程同时访问一个格式，则它必须保持外部同步。
 */
public class DateUtil {
//    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");线程不安全，报异常

    //本地的副本（以下两种写法）
    //1
    private static ThreadLocal<SimpleDateFormat> threadLocal = ThreadLocal.withInitial(
            () -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
    //2
    /*private static ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>() {
        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        }
    };*/

    public static Date parse(String dateStr) { //若不用ThreadLocal,则需要synchronized来同步

        System.out.println("输入 " + dateStr);
        Date date = null;
        try {
//            date = sdf.parse(dateStr);
            date = threadLocal.get().parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return date;
    }
}
